require "task_list/task"
require "task_list/task_factory"
require "task_list/query"
require "task_list/query_factory"

# ロジックレイヤの最上位クラス。
# インタフェースレイヤに対し、Taskに対する各種操作を提供する。
class TaskListManager
  # タスクを新規作成する
  def add(task)
    task.save()
  end

  # タスクを削除する
  def remove(task_id)
    Task.delete(task_id)
  end

  # タスクを更新する
  # @param task_id Integer 更新対象タスクの識別子。非nil。見つからなければ新規作成する。
  # @param user_id Integer タスクを入力したユーザの識別子。非nil
  # @param priority Integer タスクの優先度。nilならば更新しない。
  # @param status String タスクの状態。'done', 'undone'のいずれか。nilならば更新しない。
  # @param due Date タスクの期日。nilならば更新しない。
  # @param title タスクの表題。nilならば更新しない。
  def modify(task_id, user_id, priority, status, due, title)
    task = TaskFactory.modify(task_id, user_id, priority, status, due, title, nil)
    task.save()
  end
  
  # タスクを更新する
  # @param task_id Integer 更新対象タスクの識別子。非nil。見つからなければ新規作成する。
  # @param user_id Integer タスクを更新するユーザの識別子。非nil。
  # @param status String タスクの状態。done, undoneのいずれか。nilならば更新しない。
  # @param due Date タスクの期日。nilならば更新しない。
  # @param task_string 必要に応じて各種タスク設定値（期日・優先度など）を書式に従って指定したタスク文字列。非nil。
  def modifyWithParse(task_id, user_id, status, due, task_string)
    task = TaskFactory.modify(task_id, user_id, nil, status, due, nil, task_string)
    task.save()
  end

  # 検索する
  def search(user_id, query_str=nil)
    if(query_str) then
      query = QueryFactory.create(user_id, query_str)
      query.execute()
    else
      Task.find(:all)
    end
  end
end
